Computer systems include various components to process and communicate data. Typical systems include one or multiple processors, each of which may include multiple cores, along with associated memories, input/output (I/O) devices and other such components. To improve computation efficiencies, computation accelerators, special-purpose I/O devices and other such specialized units may be provided via one or more specialized components, referred to generically herein as helper units. However, inefficiencies may occur in using such helper units, as in a typical computing environment that has a general-purpose processor and an industry-standard operating system (OS) environment, system software is isolated from application software via different privilege levels. Thus whenever a helper unit such as a special-purpose accelerator is incorporated, it is usually exposed as a device and a user-level application can only indirectly use the helper unit via the OS's device driver for the helper unit.
A processor can be connected to a helper unit via a front side bus (FSB), or input/output (I/O) link such as a Peripheral Component Interconnect (PCI) Express™ interconnect, and communication is via a traditional system interrupt mechanism. Traditionally, because peripheral devices are designed by different manufacturers, the OS requires specialized device drivers provided by the manufacturers in order to communicate with the device. Programmers then write code to use common application programming interfaces (APIs) provided by the OS to control the behavior of the devices. Thus by default, any helper unit coupled to a processor is treated as a device. The problem with having to use a device driver to access a helper unit is the inefficiency (in terms of path length from application to driver to the helper unit), and inflexibility due to OS-imposed restrictions related to “standardized” driver interfaces.